package org.uca.dss.curso1011.grupo3.gestionreservas;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.joda.time.LocalTime;

/**
 * Esta clase implementa los diferentes trayectos que realizan los diferentes
 * trenes. La definimos como final para que sólo sea posible inicializarla con
 * el constructor, pero los metodos no pueden modificarla. Estamos utilizando el
 * patron inmutable.
 *
 * @author Adolfo Barroso, Levi Orta, Juan Manuel Chaves
 */
public final class Trayecto {

    //Atributos de la clase.
    private Tren tren;
    private String origen;
    private String destino;
    private int nTramos;
    private Map<String,String> horaSalidaLlegada = new HashMap<String,String>();

    /**
     * Constructor de la clase Trayecto. Para poder crear un nuevo trayecto es
     * necesario establecer el tren que lo realiza, la ciudad desde donde parte
     * el trayecto, a la ciudad donde se dirige el trayecto, asi como tambien
     * las horas de salida y llegada del trayecto.
     *
     * @param tren: Tren que realiza el trayecto.
     * @param origen: ciudad origen del Tren.
     * @param destino: ciudad destino del Tren.
     * @param nTramos: numero de tramos de los que se compone el trayecto.
     * @param horaSalidaLlegada las hora de salida y llegada del trayecto
     * 
     */
    public Trayecto(Tren tren, String origen, String destino, int n_tramos, Map<LocalTime,LocalTime> horas) {
        this.tren = tren;
        this.origen = origen;
        this.destino = destino;
        this.nTramos = n_tramos;
        this.horaSalidaLlegada = new HashMap<String,String>();

        //Recorremos el Map con las horas para inicializar horaSalidaLlegada
        Iterator it = horas.entrySet().iterator();
        while (it.hasNext())
        {
            Map.Entry e = (Map.Entry)it.next();
            this.horaSalidaLlegada.put(e.getKey().toString(), e.getValue().toString());
        }

        this.tren.addTrayecto(this);
    }

    /**
     * Devuelve el numero de tramos de los que consta el trayecto.
     *
     * @return el nTramos del trayecto
     */
    public int getNTramos() {
        return nTramos;
    }

    /**
     * Devuelve un Map con las horas de salida y de llegada del trayecto.
     *
     * @return horasSalidaLlegada Map con las horas de salida y de llegada del trayecto
     */
    public Map<LocalTime,LocalTime> getHorasSalidaLllegada() {

        //Crea un mapa.
        Map<LocalTime,LocalTime> horasSalidaLlegada = new HashMap<LocalTime,LocalTime>();

        Iterator it = this.horaSalidaLlegada.entrySet().iterator();
        //Se rellena el mapa con la hora de salida y con la hora de llegada.
        while (it.hasNext())
        {
            Map.Entry e = (Map.Entry)it.next();
            horasSalidaLlegada.put(new LocalTime(e.getKey()), new LocalTime(e.getValue()));
        }
        return horasSalidaLlegada;
    }

    /**
     * Devuelve la ciudad origen del trayecto.
     *
     * @return el origen del trayecto
     */
    public String getOrigen() {
        return origen;
    }

    /**
     * Devuelve la ciudad destino del trayecto.
     *
     * @return el destino del trayecto
     */
    public String getDestino() {
        return destino;
    }

    /**
     * Devuelve el tren que cubre el trayecto.
     *
     * @return el tren del trayecto
     */
    public Tren getTren() {
        return tren;
    }

     /**
     * Devuelve el precio del trayecto.
     *
     * @return el precio del trayecto
     */
    public double getPrecio() {
        return this.nTramos * this.tren.getPrecioTramo();
    }

    /**
     * Compara el trayecto con otro recibido como parametros. El metodo devuelve
     * true si todos los campos del trayecto pasado como parametro coinciden con
     * con los campos del trayecto, o false si algun campo no coincide.
     *
     * @param tr trayecto para comparar
     */
    public boolean equals(Trayecto tr){
        return this.getDestino().equals(tr.getDestino()) &&
               this.getOrigen().equals(tr.getOrigen()) &&
               this.getHorasSalidaLllegada().equals(tr.getHorasSalidaLllegada());
    }
}
